import redis
from django.shortcuts import render
from django.views import View
from libs.captcha.captcha import captcha
from django_redis import get_redis_connection
from django.http import HttpResponse
from django import http
import random
import logging
logger = logging.getLogger('django')
from libs.yuntongxun.sms import CCP
from celery_tasks.sms_send_code.tasks import send_sms_code,test

# Create your views here.
#验证图形验证码


class ImageCodeView(View):
    """图形验证码"""

    def get(self, request, uuid):

        """
        :param request: 请求对象
        :param uuid: 唯一标识图形验证码所属于的用户
        :return: image/jpeg
        """
        #生成图片验证码和图片
        text, image = captcha.generate_captcha()
        #保存 图片 验证码到数据库
        #1.创建redis的链接对象
        redis_conn=get_redis_connection('img_code')
        #2.存储验证码
        redis_conn.setex('img_%s'%uuid,300,text)
        #响应图片验证码
        return HttpResponse(image,content_type='image/jpeg')

class SMSCodeView(View):
    """短信验证码"""

    def get(self, reqeust, mobile):



        """
        :param reqeust: 请求对象
        :param mobile: 手机号
        :return: JSON
        """
        #接受参数
        image_code=reqeust.GET.get('image_code')
        image_code_id=reqeust.GET.get('image_code_id')
        #校验参数
        if not all([image_code,image_code_id]):
            return http.JsonResponse({'code':400,'errmsg':'缺少参数'})
        #链接数据库 查验参数
        redis_conn=get_redis_connection('img_code')
        #提取验证码
        image_code_server=redis_conn.get('img_%s'%image_code_id)

        #判断数据是否存在
        if image_code_server is None:
            return http.JsonResponse({'code':401,'errmsg':'验证码过期或者不存在'})
        #删除图形验证码避免重复发送
        try:
            redis_conn.delete('img_%s'%image_code_id)
        except Exception as e:
            logger(e)
        #验证图形验证码是否正确
        if image_code.lower()!=image_code_server.decode().lower():
            return  http.JsonResponse({'code':402,'errmsg':'验证码错误'})
        redis_conn = get_redis_connection('sms_code')
        #避免验证码重复发送
        sms_send_flag=redis_conn.get('flag_%s'%mobile)
        if sms_send_flag:
            return http.JsonResponse({'code':403,'errmsg':'短信已经发送或者5分钟后重发'})

        #所有数据校验完成准备发送验证码
        #1.产生随机数
        r_code='%04d'%random.randint(0,9999)
        r_code_time=300 #有效期时间
        # logger(r_code)

        #2.存储验证码 pipeline管道技术 提高性能
        pl = redis_conn.pipeline()
        pl.setex('sms_%s'%mobile,r_code_time,r_code)
        pl.setex('flag_%s' % mobile, r_code_time, 1)
        pl.execute()

        #3.发送短信'
        # test.delay()
        # send_sms_code.delay(mobile,r_code)
        CCP.send_template_sms(mobile,[r_code,r_code_time/60],1)

        return http.JsonResponse({'code':0,'errmsg':'successful'})
